package com.gsbelarus.gedemin.lib.ui.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.widget.TextView;

import com.afollestad.materialdialogs.GravityEnum;
import com.afollestad.materialdialogs.MaterialDialog;
import com.gsbelarus.gedemin.lib.R;
import com.gsbelarus.gedemin.lib.ui.interfaces.OnConfirmDialog;

/**
 * Класс для работы с диалогами
 */
final public class DialogHelper {

    public static final short CONFIRM_DIALOG_OK = 0;
    public static final short CONFIRM_DIALOG_CANCEL = 1;

    private OnConfirmDialog listner;
    private Activity activity;

    public DialogHelper(Activity activity) {
        this.activity = activity;
    }

    public void setOnConfirmListner(OnConfirmDialog listner) {
        this.listner = listner;
    }

    /**
     * Диалог с сообщением в дизайне material
     *
     * @param title          текст заголовка. Если null, то не отображается
     * @param message        текст сообщения. Если null, то не отображается
     * @param messageGravity гравити сообщения. Если null, то используется гравити по умолчанию
     */
    public MaterialDialog showMaterialDialog(String title, String message, GravityEnum messageGravity) {
        MaterialDialog.Builder dialogBuilder = new MaterialDialog.Builder(activity);
        if (title != null)
            dialogBuilder.title(title);
        if (message != null)
            dialogBuilder.content(message);
        if (messageGravity != null)
            dialogBuilder.contentGravity(messageGravity);

        dialogBuilder.positiveText(R.string.dialog_ok);

        MaterialDialog dialog = dialogBuilder.build();
        if (activity.isFinishing()) return null;
        dialog.show();

        return dialog;
    }

    /**
     * Диалог подтверждения в дизайне material
     *
     * @param title   текст заголовка. Если null, то не отображается
     * @param message текст сообщения. Если null, то не отображается
     */
    public MaterialDialog showMaterialConfirmDialog(String title, String message) {
        MaterialDialog.Builder dialogBuilder = new MaterialDialog.Builder(activity);
        if (title != null)
            dialogBuilder.title(title);
        if (message != null)
            dialogBuilder.content(message);

        dialogBuilder
                .positiveText(R.string.dialog_yes)
                .negativeText(R.string.dialog_cancel)
                .cancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        listner.confirmDialog(CONFIRM_DIALOG_CANCEL);
                    }
                })
                .callback(new MaterialDialog.ButtonCallback() {
                    @Override
                    public void onPositive(MaterialDialog dialog) {
                        super.onPositive(dialog);
                        listner.confirmDialog(CONFIRM_DIALOG_OK);
                    }

                    @Override
                    public void onNegative(MaterialDialog dialog) {
                        super.onNegative(dialog);
                        listner.confirmDialog(CONFIRM_DIALOG_CANCEL);
                    }
                });
        MaterialDialog dialog = dialogBuilder.build();
        if (activity.isFinishing()) return null;
        dialog.show();
        return dialog;
    }

    /**
     * Дилог с вращающимся индикатором в дизайне material
     *
     * @param title      текст заголовка. Если null, то не отображается
     * @param message    текст сообщения. Если null, то не отображается
     * @param cancelable закрываемый диалог или нет.
     */
    public MaterialDialog showMaterialProgressDialog(String title, String message, boolean cancelable) {
        MaterialDialog.Builder dialogBuilder = new MaterialDialog.Builder(activity);
        if (title != null)
            dialogBuilder.title(title);
        if (message != null)
            dialogBuilder.content(message);

        dialogBuilder
                .cancelable(cancelable)
                .progress(true, 0);

        MaterialDialog dialog = dialogBuilder.build();
        if (activity.isFinishing()) return null;
        dialog.show();
        return dialog;
    }

    /**
     * Диалог с сообщением
     *
     * @param title          текст заголовка. Если null, то не отображается
     * @param message        текст сообщения. Если null, то не отображается
     * @param messageGravity гравити сообщения. Если null, то используется гравити по умолчанию
     */
    @Deprecated
    public AlertDialog showDialog(String title, String message, Integer messageGravity) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
        if (title != null)
            dialogBuilder.setTitle(title);
        if (message != null)
            dialogBuilder.setMessage(message);

        dialogBuilder.setPositiveButton(activity.getResources().getString(R.string.dialog_ok), null);

        AlertDialog dialog = dialogBuilder.create();
        if (activity.isFinishing()) return null;
        dialog.show();

        if (messageGravity != null) {
            TextView messageText = (TextView) dialog.findViewById(android.R.id.message);
            messageText.setGravity(messageGravity);
        }
        return dialog;
    }

    /**
     * Диалог подтверждения
     *
     * @param title   текст заголовка. Если null, то не отображается
     * @param message текст сообщения. Если null, то не отображается
     */
    @Deprecated
    public AlertDialog showConfirmDialog(String title, String message) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
        if (title != null)
            dialogBuilder.setTitle(title);
        if (message != null)
            dialogBuilder.setMessage(message);

        dialogBuilder
                .setPositiveButton(activity.getResources().getString(R.string.dialog_yes), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        listner.confirmDialog(CONFIRM_DIALOG_OK);
                    }
                })
                .setNegativeButton(activity.getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        listner.confirmDialog(CONFIRM_DIALOG_CANCEL);
                    }
                })
                .setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialogInterface) {
                        listner.confirmDialog(CONFIRM_DIALOG_CANCEL);
                    }
                });
        AlertDialog dialog = dialogBuilder.create();
        if (activity.isFinishing()) return null;
        dialog.show();
        return dialog;
    }

    /**
     * Дилог с вращающимся индикатором
     *
     * @param title      текст заголовка. Если null, то не отображается
     * @param message    текст сообщения. Если null, то не отображается
     * @param cancelable закрываемый диалог или нет.
     */
    @Deprecated
    public ProgressDialog showProgressDialog(String title, String message, boolean cancelable) {
        ProgressDialog progressDialog = new ProgressDialog(activity);
        if (title != null)
            progressDialog.setTitle(title);
        if (message != null)
            progressDialog.setMessage(message);
        progressDialog.setCancelable(cancelable);
        if (activity.isFinishing()) return null;
        progressDialog.show();
        return progressDialog;
    }
}
